package udp.server;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
@SuppressWarnings({"all"})
// 回显服务器
public class UdpEchoServer {
    // 要创建一个服务器，先打开一个socket文件
    private DatagramSocket socket = null;
    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }
    // 开始创建服务器，这里我们是回显服务器
    public void start() throws IOException {
        System.out.println("开始启动服务器！");
        while (true) {
            // 1、尝试接收（读取）客户端的请求，传输数据是以 DatagramPacket为基本单位
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(requestPacket); // 把接收到的数据包放到该方法的参数中（输出型参数）如果此时客户端没有发送请求，就该方法就陷入阻塞等待中

            // 2、对请求进行解析，把DatagramPacket转成一个String
            String request = new String(requestPacket.getData(), 0, requestPacket.getLength());
            // 3.处理请求
            String response = process(request);


            // 4、把响应构造成DatagramPacket对象
            // 构造响应对象，要搞清楚，对象要发给谁，谁给咱们发的请求，咱就发给谁，response.length返回的是字符个数，response.getBytes().length返回的是字节个数
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(), response.getBytes().length, requestPacket.getSocketAddress());
            // 5、发送响应给客户
            socket.send(responsePacket);
            // 打印日志, requestPacket.getAddress()返回读取的客户端IP地址, requestPacket.getPort()返回读取的客户端端口号
            System.out.printf("发送方的ip和端口号：[%s:%d] request:%s, response:%s", requestPacket.getAddress().toString(), requestPacket.getPort(), request, response);
            System.out.println();
        }

    }
    // 对请求进行响应处理
    public String process(String request) {
        return request; // 回显处理就是请求发的是什么就响应什么
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(8000);
        udpEchoServer.start();
    }
}